import java.util.Arrays;
// 给你一个整数数组 nums 和一个整数 x 。每一次操作时，你应当移除数组 nums 最左边或最右边的元素，然后从 x 中减去该元素的值。
// 请注意，需要 修改 数组以供接下来的操作使用。
// 如果可以将 x 恰好 减到 0 ，返回 最小操作数 ；否则，返回 -1 。
//
//        示例 1：
//        输入：nums = [1,1,4,2,3], x = 5
//        输出：2
//        解释：最佳解决方案是移除后两个元素，将 x 减到 0 。
//
//        示例 2：
//        输入：nums = [5,6,7,8,9], x = 4
//        输出：-1
//
//        示例 3：
//        输入：nums = [3,2,20,1,1,3], x = 10
//        输出：5
//        解释：最佳解决方案是移除后三个元素和前两个元素（总共 5 次操作），将 x 减到 0 。

class Solution {
    public int minOperations(int[] nums, int x) {
        int n = nums.length, ans = Integer.MAX_VALUE;
        int l = 0, r = n-1, sum = 0;
        while(sum < x){
            if(r < 0) return -1;
            sum += nums[r--];
        }
        if(sum == x) ans = Math.min(ans, l+n-1-r);
        while(++r < n){
            sum -= nums[r];
            while(sum < x) sum += nums[l++];
            if(sum == x) ans = Math.min(ans, l+n-1-r);
        }
        return ans == Integer.MAX_VALUE? -1 : ans;
    }
}
class Solution1 {
    public int minOperations(int[] nums, int x) {
        int left=0;
        int n=nums.length;
        int ans=n+1;
        int right=0;
        int sum= Arrays.stream(nums).sum();
        int leftsum=0,rightsum=sum;
        if(sum<x){
            return -1;
        }
        for ( left = -1; left < n; ++left) {
            if (left != -1) {
                leftsum += nums[left];
            }
            while (right < n && leftsum + rightsum > x) {
                rightsum -= nums[right];
                ++right;
            }
            if (leftsum + rightsum == x) {
                ans = Math.min(ans, (left + 1) + (n - right));
            }
        }
        return ans>n?-1:ans;
    }
}
class Solution3 {
    public int minOperations(int[] nums, int x) {

        int sum = Arrays.stream(nums).sum();
        int target=sum-x;
        if(target<0){
            return -1;
        }
        int n=nums.length;
        int len=-1;
        for(int left=0,right=0,tmp=0;right<n;right++){
            tmp+=nums[right];
            while(tmp>target){
                tmp-=nums[left++];
            }
            if(tmp==target){
                len=Math.max(len,right-left+1);
            }
        }
        if(len==-1){
            return len;
        }
        return n-len;
    }
}
public class demo1 {
    public static void main(String[] args) {
        int[] nums = {1,1,4,2,3};
        int x = 5;
        Solution solution=new Solution();
        int a=solution.minOperations(nums,x);
        System.out.println(a);
    }
}
